<?php
require_once 'PHPUnit/Framework.php';
require_once "amicitia/conf/Conf.class.php";
require_once 'amicitia/arquitectura/Cargador.class.php';
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/persistencia/daos/","FabricaDao");
def("amicitia/modelo/entidades/","Juego");
def("amicitia/modelo/entidades/","Pareja");
def("amicitia/modelo/entidades/","Persona");

/**
 * Prueba todo lo concerniente al DaoPareja.
 *
 * @author Willy A. Kuster
 */
class PruebaDaoPareja extends PHPUnit_Framework_TestCase {

	private $daoPareja;

	/**
	 * Realiza la conexión a la base de datos y crea una instancia de
	 * DaoPersona.
	 */
	protected function setUp() {
		ConexionBD::getConexionBD()->conectar();
		$fabricaDao = FabricaDao::obtenerFabrica();
		$this->daoPareja = $fabricaDao->obtenerDaoPareja();
	}

	/**
	 * Prueba la obtención de una pareja.
	 */
	public function testObtenerPareja() {
		$id = 10;
		
		$parejaEsperada = new Pareja();
		$parejaEsperada->setId($id);
		
		$dador = new Persona();
		$dador->setId(10);
		$dador->setAlias("willykc");
		$dador->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$dador->setNombre("Willy");
		$dador->setApellido("Kuster");
		$dador->setEmail("willykc@gmail.com");
		$dador->setSexo("m");
		$parejaEsperada->setDador($dador);
		
		$receptor = new Persona();
		$receptor->setId(6);
		$receptor->setAlias("manzanita");
		$receptor->setPassword("a8690d965bbb5f5818a13a8535afcdb3bc18da7c");
		$receptor->setNombre("Xenia");
		$receptor->setApellido("Marcinko");
		$receptor->setEmail("manzanita_11@hotmail.com");
		$receptor->setSexo("f");
		$parejaEsperada->setReceptor($receptor);
		
		$pareja = $this->daoPareja->obtenerPareja($id);
		$this->assertEquals($parejaEsperada, $pareja);
	}
	
	/**
	 * Prueba el caso en el que se pase un id que no tiene un registro asociado
	 * en la base de datos.
	 */
	public function testObtenerParejaNoExistente() {
		$pareja = $this->daoPareja->obtenerPareja(0);
		$this->assertEquals(NULL, $pareja);
	}
	
	/**
	 * Prueba la objtención de un arreglo de parejas relacionadas a un Juego.
	 */
	public function testObtenerParejasDeJuego() {
		$juego = new Juego();
		$juego->setId(1);
		
		for($i=1;$i<=10;$i++)
			$parejasEsperadas[$i] = $this->daoPareja->obtenerPareja($i);
		
		$parejas = $this->daoPareja->obtenerParejasDeJuego($juego);
		$this->assertEquals(10,count($parejas));
		$this->assertEquals($parejasEsperadas, $parejas);
	}
	
	/**
	 * Prueba el caso en el que se intenta obtener las parejas de un Juego
	 * inexistente. 
	 */
	public function testObtenerParejasDeJuegoNoExistente() {
		$juego = new Juego();
		$juego->setId(0);
		
		$parejas = $this->daoPareja->obtenerParejasDeJuego($juego);
		$this->assertEquals(NULL, $parejas);
	}
	
	/**
	 * Prueba el guardado de una pareja en la base de datos.
	 */
	public function testGuardarPareja() {
		$pareja = new Pareja();
		
		$dador = new Persona();
		$dador->setId(10);
		$dador->setAlias("willykc");
		$dador->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$dador->setNombre("Willy");
		$dador->setApellido("Kuster");
		$dador->setEmail("willykc@gmail.com");
		$dador->setSexo("m");
		$pareja->setDador($dador);
		
		$receptor = new Persona();
		$receptor->setId(7);
		$receptor->setAlias("rigo");
		$receptor->setPassword("461b992e3aaa155a76b273abaed0f616cd41ba1c");
		$receptor->setNombre("Rigoberto");
		$receptor->setApellido("Jorges");
		$receptor->setEmail("rigzar@hotmail.com");
		$receptor->setSexo("m");
		$pareja->setReceptor($receptor);
		
		$id = $this->daoPareja->guardarPareja($pareja);
		
		$parejaGuardada = $this->daoPareja->obtenerPareja($id);
		
		$pareja->setId($id);
		
		$this->assertEquals($pareja, $parejaGuardada);
	}
	
	/**
	 * Prueba el borrado de una pareja en la base de datos.
	 */
	public function testEliminarPareja() {
		$pareja = new Pareja();
		
		$dador = new Persona();
		$dador->setId(10);
		$pareja->setDador($dador);
		
		$receptor = new Persona();
		$receptor->setId(7);
		$pareja->setReceptor($receptor);
		
		$id = $this->daoPareja->guardarPareja($pareja);
		
		$exito = $this->daoPareja->eliminarPareja($id);
		
		$pareja = $this->daoPareja->obtenerPareja($id);
		
		$this->assertTrue($exito);
		$this->assertEquals(NULL, $pareja);
	}
	
	/**
	 * Deshace todos los cambios y cierra la conexión a la base de datos.
	 */
	protected function tearDown() {
		ConexionBD::getConexionBD()->deshacer();
		ConexionBD::getConexionBD()->desconectar();
	}
	
}
?>